package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.CategoriaEconomicaDeDespesaDAO;
import br.com.duosoftware.orcamento.daos.ElementoDAO;
import br.com.duosoftware.orcamento.daos.ElementoDeDespesaDAO;
import br.com.duosoftware.orcamento.daos.ModalidadeDAO;
import br.com.duosoftware.orcamento.daos.NaturezaDAO;
import br.com.duosoftware.orcamento.entidades.CategoriaEconomicaDeDespesa;
import br.com.duosoftware.orcamento.entidades.Elemento;
import br.com.duosoftware.orcamento.entidades.ElementoDeDespesa;
import br.com.duosoftware.orcamento.entidades.Modalidade;
import br.com.duosoftware.orcamento.entidades.Natureza;
import br.com.duosoftware.orcamento.services.ElementoDeDespesaService;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 *
 */
@ManagedBean
@ViewScoped
public class ElementoDeDespesaBean implements Serializable {

    private ElementoDeDespesa elementoDeDespesa;
    private List<ElementoDeDespesa> elementosDeDespesa;
    private ElementoDeDespesaDAO elementoDeDespesaDAO;
    private ElementoDeDespesaService elementoDeDespesaService;
    //
    ///****Select Itens****
    //
    private List<SelectItem> categoriasEconomicaDeDespesa;
    private List<SelectItem> naturezas;
    private List<SelectItem> modalidades;
    private List<SelectItem> elementos;

    public ElementoDeDespesaBean() {

        elementoDeDespesaService = new ElementoDeDespesaService();

        elementoDeDespesaDAO = new ElementoDeDespesaDAO();

    }

    public ElementoDeDespesa getElementoDeDespesa() {
        return elementoDeDespesa;
    }

    public void setElementoDeDespesa(ElementoDeDespesa elementoDeDespesa) {
        this.elementoDeDespesa = elementoDeDespesa;
    }

    public List<ElementoDeDespesa> getElementosDeDespesa() {

        if (elementosDeDespesa == null) {

            elementosDeDespesa = elementoDeDespesaDAO
                    .listarElementosDeDespesa();

        }

        return elementosDeDespesa;
    }

    public void setElementosDeDespesa(List<ElementoDeDespesa> elementosDeDespesa) {
        this.elementosDeDespesa = elementosDeDespesa;
    }

    public ElementoDeDespesaService getElementoDeDespesaService() {
        return elementoDeDespesaService;
    }

    /**
     * <b>Método que inicializa a elementoDeDespesa a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        elementoDeDespesa = new ElementoDeDespesa();

    }

    /**
     * <b>Método que adiciona ou edita uma ElementoDeDespesa</b><p>
     *
     * Após o término o método fecha o dialog de cadastro.
     * <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        elementoDeDespesaDAO.salvarOuAtualizar(elementoDeDespesa);
        elementoDeDespesa = new ElementoDeDespesa();
        elementosDeDespesa = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgElementoDeDespesa.hide()");
        requestContext.update("formElementosDeDespesa:dtElementosDeDespesa");

    }

    /**
     * <b>Método para iniciar o processo de edição de um ElementoDeDespesa.</b>
     * <p>
     *
     * Ele verifica se há um ElementoDeDespesa selecionada para edição, se não
     * houver é emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um ElementoDeDespesa selecionado o médoto abre o dialog para
     * edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (elementoDeDespesa == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgElementoDeDespesa.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um
     * ElementoDeDespesa.</b>
     * <p>
     *
     * Ele verifica se há uma ElementoDeDespesa selecionado para exclusão, se
     * não houver é emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um ElementoDeDespesa selecionado o médoto abre um p:dialog para
     * confirma ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (elementoDeDespesa == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirElementoDeDespesa.show()");
        }

    }

    /**
     * <b>Método para excluir um ElementoDeDespesa.</b>
     * <p>
     *
     * Ele verifica se a ElementoDeDespesa selecionado para exclusão está sendo
     * utilizado por alguma outra tabela do banco. Se estiver uma mensagem de
     * aviso é dada ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            elementoDeDespesaDAO.excluir(elementoDeDespesa);
            elementoDeDespesa = new ElementoDeDespesa();
            elementosDeDespesa = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirElementoDeDespesa.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b>
     * <p>
     *
     * O método instancia um novo objeto na variável ElementoDeDespesa para
     * limpar as infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        elementoDeDespesa = new ElementoDeDespesa();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgElementoDeDespesa.hide()");
        requestContext.update("formElementoDeDespesa:dtElementosDeDespesa");

    }

    //chamada a métodos do service
    
    public void obterSequencia(){
        
        elementoDeDespesaService.obterSequencia(elementoDeDespesa);
        
    }
    
    public void obterCodigo(){
        
        elementoDeDespesaService.obterCodigo(elementoDeDespesa);
        
    }
    
    //get de Select Itens
    
    public List<SelectItem> getCategoriasEconomicaDeDespesa() {

        categoriasEconomicaDeDespesa = new LinkedList<SelectItem>();

        for (CategoriaEconomicaDeDespesa categoriaEconomicaDeDespesa
                : new CategoriaEconomicaDeDespesaDAO().listarCategoriasEconomicaDeDespesa()) {

            categoriasEconomicaDeDespesa.add(
                    new SelectItem(categoriaEconomicaDeDespesa, categoriaEconomicaDeDespesa.toString()));

        }

        return categoriasEconomicaDeDespesa;

    }

    public List<SelectItem> getNaturezas() {

        if (naturezas == null) {

            naturezas = new LinkedList<SelectItem>();

            for (Natureza natureza : new NaturezaDAO().listarNaturezas()) {

                naturezas.add(new SelectItem(natureza, natureza.toString()));

            }

        }

        return naturezas;

    }

    public List<SelectItem> getModalidades() {

        if (modalidades == null) {

            modalidades = new LinkedList<SelectItem>();

            for (Modalidade modalidade : new ModalidadeDAO().listarModalidades()) {

                modalidades.add(new SelectItem(modalidade, modalidade.toString()));

            }

        }

        return modalidades;

    }
    
    public List<SelectItem> getElementos() {

        if (elementos == null) {

            elementos = new LinkedList<SelectItem>();

            for (Elemento elemento : new ElementoDAO().listarElementos()) {

                elementos.add(new SelectItem(elemento, elemento.toString()));

            }

        }

        return elementos;

    }
}
